package com.qt.leetcode;

public class Demo06 {
    public static void main(String[] args) {
        String paypalishiring = convertGptMyOwn("PAYPALISHIRING", 3);
        System.out.println(paypalishiring);
    }

    /**
     * 不要每次都想着抽取  数学模型出来，计算机就是一个暴力美学（稍微改的不那么暴力，就可以解决问题了）
     * 本次收获  ：
     * * 1.变量curRow表示当前字符应该添加到哪一行，使用变量goingDown表示当前是否需要向下移动行号。
     * 2.当curRow等于0或numRows-1时，需要更改goingDown的值，以确保正确地进行Z字形排列。
     *   3.stringbulider  后面可以继续拼接   stringbulider
     *
     *
     * @param s
     * @param numRows
     * @return
     */

    public static String convertGptMyOwn(String s, int numRows) {

        if(s.length() == 1 || numRows == 1){
            return s;
        }

        StringBuilder[] hz = new StringBuilder[numRows];
        for (int i = 0; i < hz.length; i++) {
            hz[i] = new StringBuilder();
        }

        //是否换行 变量
        //行数  变量
        boolean isDown = false;
        int rowNum = 0;//可上下移动
        for (char c : s.toCharArray()) {
            hz[rowNum].append(c);

            if(rowNum == 0 || rowNum == numRows - 1){
                isDown = !isDown;
            }
            rowNum += isDown ? 1 : -1;
        }
        StringBuilder result = new StringBuilder();
        for (StringBuilder item : hz) {
            result.append(item);
        }
        return result.toString();
    }


    /**
     * cheatgpt回答
     * @param s
     * @param numRows
     * @return
     *
     * 将一个给定字符串 s 根据给定的行数 numRows ，以从上往下、从左到右进行 Z 字形排列。
     *
     * 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时，排列如下：
     *
     * P   A   H   N
     * A P L S I I G
     * Y   I   R
     * 之后，你的输出需要从左往右逐行读取，产生出一个新的字符串，比如："PAHNAPLSIIGYIR"。
     *
     * 请你使用java实现这个将字符串进行指定行数变换的函数：
     *
     * string convert(string s, int numRows);
     */
    public static String convertGpt(String s, int numRows) {

        if (numRows == 1) {
            return s;
        }
        StringBuilder[] rows = new StringBuilder[numRows];
        for (int i = 0; i < numRows; i++) {
            rows[i] = new StringBuilder();
        }

        /**
         * 变量curRow表示当前字符应该添加到哪一行，使用变量goingDown表示当前是否需要向下移动行号。
         * 当curRow等于0或numRows-1时，需要更改goingDown的值，以确保正确地进行Z字形排列。
         */

        int curRow = 0;
        boolean goingDown = false;
        for (char c : s.toCharArray()) {
            rows[curRow].append(c);
            //当curRow等于0或numRows-1时，需要更改goingDown的值，以确保正确地进行Z字形排列
            if (curRow == 0 || curRow == numRows - 1) {
                goingDown = !goingDown;
            }
            //下移加一，上移减一
            curRow += goingDown ? 1 : -1;
        }
        StringBuilder result = new StringBuilder();
        for (StringBuilder row : rows) {
            //注意这里也可以直接 拼接 stringBuilder
            result.append(row);
        }
        return result.toString();

    }


    public static String convert(String s, int numRows) {

        int len = s.length();
        int v =  (2 * numRows) - 1 - 1;//单个v所需的长度
        int vNumver = len / v;//s可以分割的完整v个数
        int sy = len % (v - 1);//分割完整v后 剩余的长度
        StringBuilder result = new StringBuilder("");
        //第一排索引计算
        for (int k = 0; k < numRows; k++) {
            for (int i = 0; i < vNumver; i++) {
                if(i * v > len || (i * v) + 1 > len){
                    return result.toString();
                }
                result.append(s.substring(i * v,(i * v) + 1));
            }
            /*if(sy > 0){
                result.append(s.substring((vNumver + 1) * v,((vNumver + 1) * v) + 1));
            }*/
            if(sy > k){
                if((vNumver * v)  - k > len || (vNumver * v)  - k + 1 > len){
                    return result.toString();
                }
                result.append(s.substring((vNumver * v)  - k,(vNumver * v)  - k + 1));
            }
        }
        return result.toString();

    }

}
